home *** CD-ROM | disk | FTP | other *** search
/ Dr. Windows 3 / dr win3.zip / dr win3 / UTILITY1 / MSWLGO35.ZIP / EXAMPLES / PASCAL < prev    next >
Text File  |  1993-04-11  |  23KB  |  909 lines

  1. ;
  2. ; Function:
  3. ;
  4. ; Pascal Compiler
  5. ;
  6. ; To run:
  7. ;
  8. ; Load "pascal
  9. ; Call COMPILE "module.pas ! (module on disk)
  10. ; Call PRUN "module
  11. ;
  12. ; It's slow but it works.
  13. ;
  14.  
  15. TO BUGFIX :VAL
  16. OP INT :VAL
  17. END
  18. ;;; All references to BUGFIX are because products aren't integers on the Mac
  19.  
  20. TO ACOUNT :ARRAY
  21. OUTPUT COUNT :ARRAY
  22. END
  23.  
  24. TO GARRAY :ARRAY :INDEX
  25. OP ITEM BUGFIX :INDEX+1 :ARRAY
  26. END
  27.  
  28. TO PARRAY :ARRAY :INDEX :VALUE
  29. SETITEM BUGFIX :INDEX+1 :ARRAY :VALUE
  30. END
  31.  
  32. TO ARGLIST
  33. LOCAL [NAMES TYPE VARFLAG]
  34. MAKE "VARFLAG "FALSE
  35. IFBE "VAR [MAKE "VARFLAG "TRUE]
  36. MAKE "NAMES COMMALIST [ID]
  37. MUSTBE ":
  38. MAKE "TYPE TOKEN
  39. IF EQUALP :TYPE "PACKED [MAKE "TYPE TOKEN]
  40. IFELSE EQUALP :TYPE "ARRAY [MAKE "TYPE ARRAYTYPE] [TYPECHECK :TYPE]
  41. FOREACH :NAMES [NEWARG ? :TYPE NEWLNAME ? :VARFLAG]
  42. IFBEELSE "|;| [ARGLIST] [MUSTBE "|)|]
  43. END
  44.  
  45. TO ARRAYCOPY :TOTARGET :FROMTARGET
  46. LOCAL [TO FROM]
  47. MAKE "TO THING FIRST :TOTARGET
  48. MAKE "FROM THING FIRST :FROMTARGET
  49. FOR [I 0 [(ACOUNT :FROM) - 1]] [PARRAY :TO :I GARRAY :FROM :I]
  50. END
  51.  
  52. TO ARRAYSIZE :TYPE
  53. OUTPUT BUGFIX REDUCE "PRODUCT MAP [LAST ?] LAST :TYPE
  54. END
  55.  
  56. TO ARRAYTYPE
  57. LOCAL [RANGES TYPE]
  58. MUSTBE "|[|
  59. MAKE "RANGES COMMALIST [RANGE]
  60. MUSTBE "|]|
  61. MUSTBE "OF
  62. MAKE "TYPE TOKEN
  63. TYPECHECK :TYPE
  64. OUTPUT LIST :TYPE :RANGES
  65. END
  66.  
  67. TO BLOCK
  68. LOCAL [BLOCKNAME CODEINTO]
  69. MAKE "BLOCKNAME GENSYM
  70. DEFINE :BLOCKNAME [[]]
  71. MAKE "CODEINTO :BLOCKNAME
  72. BLOCKBODY "END
  73. OUTPUT (LIST :BLOCKNAME)
  74. END
  75.  
  76. TO BLOCKBODY :ENDWORD
  77. CODE STATEMENT
  78. IFBEELSE "|;| [BLOCKBODY :ENDWORD] [MUSTBE :ENDWORD]
  79. END
  80.  
  81. TO BOOLTOINT :EXPR
  82. OUTPUT (SE [( IFELSE] :EXPR [[1] [0] )])
  83. END
  84.  
  85. TO CHARTOINT :EXPR
  86. OUTPUT (SE [( ASCII FIRST BF] :EXPR [)] )
  87. END
  88.  
  89. TO CHARTOPRINT :CHARVAL
  90. OUTPUT FIRST BF :CHARVAL
  91. END
  92.  
  93. TO CODE :STUFF
  94. IF EMPTYP :STUFF [STOP]
  95. DEFINE :CODEINTO LPUT :STUFF TEXT :CODEINTO
  96. END
  97.  
  98. TO COMMALIST :TEST [:SOFAR []]
  99. LOCAL [RESULT TOKEN]
  100. MAKE "RESULT RUN :TEST
  101. IF EMPTYP :RESULT [OUTPUT :SOFAR]
  102. MAKE "TOKEN TOKEN
  103. IF EQUALP :TOKEN ", [OUTPUT (COMMALIST :TEST (LPUT :RESULT :SOFAR))]
  104. MAKE "PEEKTOKEN :TOKEN
  105. OUTPUT LPUT :RESULT :SOFAR
  106. END
  107.  
  108. TO COMPILE :FILE
  109. LOCAL "ERROR
  110. IF NAMEP "PEEKCHAR [ERN "PEEKCHAR]
  111. IF NAMEP "PEEKTOKEN [ERN "PEEKTOKEN]
  112. OPENREAD :FILE
  113. SETREAD :FILE
  114. IGNORE ERROR
  115. CATCH "ERROR [PROGRAM]
  116. MAKE "ERROR ERROR
  117. IF NOT EMPTYP :ERROR ~
  118.    [IF NOT EQUALP FIRST :ERROR 19 ~
  119.        [PR FIRST BF :ERROR]]
  120. SETREAD []
  121. CLOSE :FILE
  122. END
  123.  
  124. TO COPYOFARRAY :TARGET
  125. LOCAL [TO FROM]
  126. MAKE "FROM THING FIRST :TARGET
  127. MAKE "TO ARRAY ACOUNT :FROM
  128. FOR [I 0 [(ACOUNT :FROM) - 1]] [PARRAY :TO :I GARRAY :FROM :I]
  129. END
  130.  
  131. TO FUNCTION
  132. LOCAL [PROGNAME OLDIDLIST ARGLIST TYPE]
  133. LOCAL "CODEINTO
  134. MAKE "PROGNAME TOKEN
  135. PUSH "IDLIST (LIST :PROGNAME "FUNCTION NEWLNAME :PROGNAME)
  136. MAKE "OLDIDLIST :IDLIST
  137. LOCAL "IDLIST
  138. MAKE "IDLIST :OLDIDLIST
  139. MAKE "ARGLIST []
  140. MAKE LNAME :PROGNAME []
  141. IFBE "|(| [ARGLIST]
  142. MUSTBE ":
  143. MAKE "TYPE TOKEN
  144. TYPECHECK :TYPE
  145. MAKE LNAME :PROGNAME FPUT :TYPE THING LNAME :PROGNAME
  146. MUSTBE "|;|
  147. DEFINE LNAME :PROGNAME (LIST :ARGLIST)
  148. MAKE "CODEINTO LNAME :PROGNAME
  149. CODE [LOCAL "RESULT]
  150. PROGRAM1
  151. CODE [OUTPUT :RESULT]
  152. MUSTBE "|;|
  153. END
  154.  
  155. TO GETCHAR
  156. LOCAL "CHAR
  157. IF NAMEP "PEEKCHAR [MAKE "CHAR :PEEKCHAR ERN "PEEKCHAR OUTPUT :CHAR]
  158. IF EOFP [OUTPUT CHAR 1]
  159. OUTPUT RC1
  160. END
  161.  
  162. TO GETTYPE :WORD
  163. LOCAL "RESULT
  164. MAKE "RESULT LNAME1 :WORD :IDLIST
  165. IF NOT EMPTYP :RESULT [OUTPUT ITEM 2 :RESULT]
  166. PRINT SE [UNRECOGNIZED IDENTIFIER] :WORD
  167. THROW "ERROR
  168. END
  169.  
  170. TO ID
  171. LOCAL "TOKEN
  172. MAKE "TOKEN TOKEN
  173. IF LETTERP ASCII FIRST :TOKEN [OUTPUT :TOKEN]
  174. MAKE "PEEKTOKEN :TOKEN
  175. OUTPUT []
  176. END
  177.  
  178. TO IFBE :WANTED :ACTION
  179. LOCAL "TOKEN
  180. MAKE "TOKEN TOKEN
  181. IF EQUALP :TOKEN :WANTED [RUN :ACTION STOP]
  182. MAKE "PEEKTOKEN :TOKEN
  183. END
  184.  
  185. TO IFBEELSE :WANTED :ACTION :ELSE
  186. LOCAL "TOKEN
  187. MAKE "TOKEN TOKEN
  188. IF EQUALP :TOKEN :WANTED [RUN :ACTION STOP]
  189. MAKE "PEEKTOKEN :TOKEN
  190. RUN :ELSE
  191. END
  192.  
  193. TO LETTERP :CODE
  194. IF AND (:CODE > 64) (:CODE < 91) [OUTPUT "TRUE]
  195. OUTPUT AND (:CODE > 96) (:CODE < 123)
  196. END
  197.  
  198. TO LINDEX :BOUNDS :INDEX
  199. OUTPUT LINDEX1 (OFFSET PINTEGER FIRST :INDEX FIRST FIRST :BOUNDS) ~
  200.                BF :BOUNDS BF :INDEX
  201. END
  202.  
  203. TO LINDEX1 :SOFAR :BOUNDS :INDEX
  204. IF EMPTYP :BOUNDS [OUTPUT :SOFAR]
  205. OUTPUT LINDEX1 (NEXTINDEX :SOFAR ~
  206.                           LAST FIRST :BOUNDS ~
  207.                           PINTEGER FIRST :INDEX ~
  208.                           FIRST FIRST :BOUNDS) ~
  209.                BF :BOUNDS BF :INDEX
  210. END
  211.  
  212. TO LNAME :WORD
  213. LOCAL "RESULT
  214. MAKE "RESULT LNAME1 :WORD :IDLIST
  215. IF NOT EMPTYP :RESULT [OUTPUT ITEM 3 :RESULT]
  216. PRINT SE [UNRECOGNIZED IDENTIFIER] :WORD
  217. THROW "ERROR
  218. END
  219.  
  220. TO LNAME1 :WORD :LIST
  221. IF EMPTYP :LIST [OUTPUT []]
  222. IF EQUALP :WORD FIRST FIRST :LIST [OUTPUT FIRST :LIST]
  223. OUTPUT LNAME1 :WORD BF :LIST
  224. END
  225.  
  226. TO LPUSH :STACK :STUFF
  227. MAKE :STACK LPUT :STUFF THING :STACK
  228. END
  229.  
  230. TO MULT :A :B
  231. OUTPUT (SE [( PRODUCT] :A :B [)] )
  232. END
  233.  
  234. TO MUSTBE :WANTED
  235. LOCAL "TOKEN
  236. MAKE "TOKEN TOKEN
  237. IF EQUALP :TOKEN :WANTED [STOP]
  238. PRINT (SE "EXPECTED :WANTED "GOT :TOKEN)
  239. THROW "ERROR
  240. END
  241.  
  242. TO NEWARG :PNAME :TYPE :LNAME :VARFLAG
  243. IF RESERVEDP :PNAME [PR SE :PNAME [RESERVED WORD] THROW "ERROR]
  244. PUSH "IDLIST IFELSE :VARFLAG ~
  245.                     [(LIST :PNAME "VAR :LNAME :TYPE)] ~
  246.                     [(LIST :PNAME :TYPE :LNAME)]
  247. LPUSH "ARGLIST :LNAME
  248. LPUSH LNAME :PROGNAME IFELSE :VARFLAG [LIST "VAR :TYPE] [:TYPE]
  249. END
  250.  
  251. TO NEWLNAME :WORD
  252. IF MEMBERP :WORD :NAMESUSED [OUTPUT GENSYM]
  253. IF NAMEP WORD "% :WORD [OUTPUT GENSYM]
  254. PUSH "NAMESUSED :WORD
  255. OUTPUT WORD "% :WORD
  256. END
  257.  
  258. TO NEWVAR :PNAME :TYPE :LNAME
  259. IF RESERVEDP :PNAME [PR SE :PNAME [RESERVED WORD] THROW "ERROR]
  260. PUSH "IDLIST (LIST :PNAME :TYPE :LNAME)
  261. CODE LIST "LOCAL WORD "" :LNAME
  262. IF LISTP :TYPE [CODE (LIST "MAKE WORD "" :LNAME "ARRAY ARRAYSIZE :TYPE)]
  263. END
  264.  
  265. TO NEXTINDEX :OLD :FACTOR :NEW :OFFSET
  266. OUTPUT (SE [( SUM] (MULT :OLD :FACTOR) (OFFSET :NEW :OFFSET) [)] )
  267. END
  268.  
  269. TO NUMBER :NUM
  270. LOCAL "CHAR
  271. MAKE "CHAR GETCHAR
  272. IF EQUALP :CHAR ". ~
  273.    [MAKE "CHAR GETCHAR ~
  274.     IFELSE EQUALP :CHAR ". ~
  275.            [MAKE "PEEKTOKEN ".. OUTPUT :NUM] ~
  276.            [MAKE "PEEKCHAR :CHAR OUTPUT NUMBER WORD :NUM ".]]
  277. IF EQUALP :CHAR "E [OUTPUT NUMBER WORD :NUM TWOCHAR "E [+ -]]
  278. IF NUMBERP :CHAR [OUTPUT NUMBER WORD :NUM :CHAR]
  279. MAKE "PEEKCHAR :CHAR
  280. OUTPUT :NUM
  281. END
  282.  
  283. TO NUMTYPE :NUMBER
  284. IF MEMBERP ". :NUMBER [OUTPUT "REAL]
  285. IF MEMBERP "E :NUMBER [OUTPUT "REAL]
  286. OUTPUT "INTEGER
  287. END
  288.  
  289. TO OFFSET :A :B
  290. OUTPUT (SE [( DIFFERENCE] :A :B [)] )
  291. END
  292.  
  293. TO OPSETUP
  294. PPROP "|=| "BINARY [EQUALP 2 [BOOLEAN []] 1]
  295. PPROP "|<>| "BINARY [[NOT EQUALP] 2 [BOOLEAN []] 1]
  296. PPROP "|<| "BINARY [LESSP 2 [BOOLEAN []] 1]
  297. PPROP "|>| "BINARY [GREATERP 2 [BOOLEAN []] 1]
  298. PPROP "|<=| "BINARY [[NOT GREATERP] 2 [BOOLEAN []] 1]
  299. PPROP "|>=| "BINARY [[NOT LESSP] 2 [BOOLEAN []] 1]
  300. PPROP "|+| "BINARY [SUM 2 2]
  301. PPROP "|-| "BINARY [DIFFERENCE 2 2]
  302. PPROP "OR "BINARY [OR 2 [BOOLEAN BOOLEAN] 2]
  303. PPROP "|*| "BINARY [PRODUCT 2 3]
  304. PPROP "|/| "BINARY [QUOTIENT 2 [REAL []] 3]
  305. PPROP "DIV "BINARY [[INT QUOTIENT] 2 [INTEGER INTEGER] 3]
  306. PPROP "MOD "BINARY [REMAINDER 2 [INTEGER INTEGER] 3]
  307. PPROP "AND "BINARY [AND 2 [BOOLEAN BOOLEAN] 3]
  308. PPROP "|+| "UNARY [[] 1 4]
  309. PPROP "|-| "UNARY [MINUS 1 4]
  310. PPROP "NOT "UNARY [NOT 1 [BOOLEAN BOOLEAN] 4]
  311. MAKE "IDLIST [[TRUNC FUNCTION INT] ~
  312.               [ROUND FUNCTION ROUND] [RANDOM FUNCTION RANDOM]]
  313. MAKE "INT [INTEGER REAL]
  314. MAKE "ROUND [INTEGER REAL]
  315. MAKE "RANDOM [INTEGER INTEGER]
  316. END
  317.  
  318. TO PARRAYASSIGN :NAME :TYPE :TARGET
  319. LOCAL [RIGHT RTYPE RLNAME RTARGET]
  320. MAKE "RIGHT TOKEN
  321. IF EQUALP FIRST :RIGHT "' [OUTPUT PSTRINGASSIGN :TARGET :TYPE (BL BF :RIGHT)]
  322. MAKE "RTYPE GETTYPE :RIGHT
  323. MAKE "RLNAME LNAME :RIGHT
  324. IFELSE EQUALP :RTYPE "VAR [PVARRIGHT] [MAKE "RTARGET (LIST :RLNAME)]
  325. IF EQUALP :TYPE :RTYPE [OUTPUT (LIST "ARRAYCOPY :TARGET :RTARGET)]
  326. PR (SE "ARRAYS :NAME "AND :RIGHT [UNEQUAL TYPES])
  327. THROW "ERROR
  328. END
  329.  
  330. TO PARRAYDATA :PNAME :TYPE :TARGET
  331. LOCAL "INDEX
  332. MUSTBE "|[|
  333. MAKE "INDEX COMMALIST [PEXPR]
  334. MUSTBE "|]|
  335. MAKE "INDEX LINDEX LAST :TYPE :INDEX
  336. MAKE "TYPE FIRST :TYPE
  337. MAKE "TARGET SE :TARGET :INDEX
  338. OUTPUT PMAYBECHAR :TYPE (LIST "PTHING :TARGET)
  339. END
  340.  
  341. TO PASSIGN
  342. LOCAL [NAME TYPE INDEX VALUE LNAME TARGET]
  343. MAKE "NAME TOKEN
  344. MAKE "IND